package com.stark.wechat.context;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 线程安全的作用域工具类。
 * <p>获取当前线程中最近一次请求的 {@link HttpServletRequest} 对象和 {@link HttpServletResponse} 对象。
 * @author Ben
 * @since 1.0.0
 * @version 1.0.0, 2017/8/5
 */
public class ScopeUtil {
	private static ThreadLocal<HttpServletRequest> requestThreadLocal = new ThreadLocal<>();
	private static ThreadLocal<HttpServletResponse> responseThreadLocal = new ThreadLocal<>();

	/**
	 * 获取当前线程中最近一次请求的 {@link HttpServletRequest} 对象。
	 * @return 当前线程中最近一次请求的 {@link HttpServletRequest} 对象。
	 */
	public static HttpServletRequest getRequest() {
		return requestThreadLocal.get();
	}
	
	/**
	 * 设置当前线程中的 {@link HttpServletRequest} 对象。
	 * @param request 请求的 {@link HttpServletRequest} 对象。
	 */
	public static void setRequest(HttpServletRequest request) {
		requestThreadLocal.set(request);
	}
	
	/**
	 * 获取当前线程中最近一次请求的 {@link HttpServletResponse} 对象。
	 * @return 当前线程中最近一次请求的 {@link HttpServletResponse} 对象。
	 */
	public static HttpServletResponse getResponse() {
		return responseThreadLocal.get();
	}
	
	/**
	 * 设置当前线程中的 {@link HttpServletResponse} 对象。
	 * @param response 请求的 {@link HttpServletResponse} 对象。
	 */
	public static void setResponse(HttpServletResponse response) {
		responseThreadLocal.set(response);
	}
	
	/**
	 * 获取 {@linkplain javax.servlet.http.HttpSession HttpSession} 中的用户对象。
	 * @return 用户对象
	 */
	public static Object getSessionUser() {
		Object user = ScopeUtil.getRequest().getSession().getAttribute("user");
		return user;
	}
	
	/**
	 * 获取 {@linkplain javax.servlet.http.HttpSession HttpSession} 中的用户对象。
	 * @param requiredType 用户对象类名
	 * @return 用户对象
	 */
	public static <T> T getSessionUser(Class<T> requiredType) {
		@SuppressWarnings("unchecked")
		T user = (T) ScopeUtil.getRequest().getSession().getAttribute("user");
		return user;
	}
	
	/**
	 * 设置 {@linkplain javax.servlet.http.HttpSession HttpSession} 中的用户对象。
	 * @param user 用户对象
	 */
	public static void setSessionUser(Object user) {
		ScopeUtil.getRequest().getSession().setAttribute("user", user);
	}
}
